// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

namespace Neto.Db.SqlSugar;

/// <summary>
///     SqlSugar 默认设置
/// </summary>
[SuppressSniffer]
public class SqlSugarDbSettingOptions : IConfigurableOptionsListener<SqlSugarDbSettingOptions>
{
    /// <summary>
    ///     雪花ID
    /// </summary>
    public int SnowFlakeSingle_WorkId { get; set; } = 1;

    ///// <summary>
    ///// 实体数据库是否自增
    ///// </summary>
    //public bool EntityIsIdentity { get; set; } = true;

    ///// <summary>
    ///// 主键不自增的数据库表名
    ///// </summary>
    //public List<string> NoIsIdentityDbTables { get; set; }

    /// <summary>
    ///     数据库名称
    /// </summary>
    public string DataBaseName { get; set; }

    /// <summary>
    ///     数据库创建路径
    /// </summary>
    public string DatabaseDirectory { get; set; }

    /// <summary>
    ///     数据库表名 驼峰转下划线，pgsql，oracle需要转，sqlserver可以不转，转了后代码生成可正常
    /// </summary>
    public bool EnableDbTableNameToUnderLine { get; set; }

    /// <summary>
    ///     数据库表列名 驼峰转下划线，pgsql，oracle需要转，sqlserver可以不转，转了后代码生成可正常
    /// </summary>
    public bool EnableDbColumnNameToUnderLine { get; set; }

    /// <summary>
    ///     是否初始化数据库
    /// </summary>
    public bool EnableInitDatabase { get; set; }

    /// <summary>
    ///     是否初始化数据种子
    /// </summary>
    public bool EnableInitDataSeed { get; set; }

    /// <summary>
    ///     字符串是否默认可空
    /// </summary>
    public bool StringIsNullable { get; set; } = true;

    ///// <summary>
    ///// 字符串默认长度
    ///// </summary>
    //public int StringDefaultLength { get; set; } = 500;

    /// <summary>
    ///     是否启用了租户，启用了租户会自动生成配置表：TenantDbConfig
    /// </summary>
    public bool EnableTanant { get; set; } = false;

    ///// <summary>
    ///// 实体命名空间前缀,数组，可多个
    ///// </summary>
    //public List<string> EntitiesNamespacePrefixs { get; set; }

    ///// <summary>
    ///// 实体所在程序集，可配置多个
    ///// </summary>
    //public List<string> EntitiesAssemblys { get; set; }

    /// <summary>
    ///     是否记录执行的sql
    /// </summary>
    public bool IsRecordExecSql { get; set; }

    /// <summary>
    ///     是否记录非参数化执行sql
    /// </summary>
    public bool IsRecordNoParsExecSql { get; set; }

    /// <summary>
    ///     是否记录事件总线执行的sql
    /// </summary>
    public bool IsRecordEventBusExecSql { get; set; }

    /// <summary>
    ///     是否控制台输出执行sql
    /// </summary>
    public bool IsConsoleOutExecSql { get; set; }

    /// <summary>
    ///     启用库表差异日志
    /// </summary>
    public bool EnableDiffLog { get; set; }

    /// <summary>
    ///     是否启用 Yitter.IdGenerator 的雪花ID
    ///     比较短点
    /// </summary>
    public bool EnableYitterIdGenerator { get; set; }

    /// <summary>
    ///     是否启用全局删除查询过滤器
    /// </summary>
    public bool IsAutoDeleteQueryFilter { get; set; } = true;

    /// <summary>
    ///     是否启用全局更新查询过滤器 （表达式更新，如果是实体方式更新建议先查询在更新）
    /// </summary>
    public bool IsAutoUpdateQueryFilter { get; set; } = true;

    /// <summary>
    ///     是否启用SqlSugar二级缓存
    /// </summary>
    public bool IsEnableSqlSugarWithCache { get; set; }

    /// <summary>
    ///     是否启用全局查询无锁 WITH (NOLOCK)、允许脏读
    /// </summary>
    public bool IsWithNoLockQuery { get; set; }

    /// <summary>
    ///     是否启用全局子查询无锁 WITH (NOLOCK)、允许脏读
    /// </summary>
    public bool IsWithNoLockSubquery { get; set; }

    /// <summary>
    ///     是否在事务中禁用无锁查询,目前只支持SqlServer（20240416）
    ///     与IsWithNoLockQuery  2个一起用就是事务中不NOLOCK
    /// </summary>
    public bool DisableWithNoLockWithTran { get; set; }

    /// <summary>
    ///     PGSQL支持配置启用ILIKE (MoreSettings?.EnableILike == true)
    ///     ILike 不区分大小写
    /// </summary>
    public bool PgSqlEnableILike { get; set; } = false;

    /// <summary>
    ///     是否启用数据信息缓存服务，默认false
    /// </summary>
    public bool EnableDataInfoCacheService { get; set; }

    /// <summary>
    ///     Sql超时,默认是60秒，单位秒
    /// </summary>
    public int AdoCommandTimeOut { get; set; } = 60;

    /// <summary>
    ///     数据库配置集合
    /// </summary>
    public List<SqlSugarDbSettingConnectionConfig> ConnectionConfigs { get; set; }

    public void OnListener(SqlSugarDbSettingOptions options, IConfiguration configuration)
    {
        //Name = options.Name;  // 实时的最新值
        //Version = options.Version;  // 实时的最新值
        //Company = options.Company;//公司

        var entityType = GetType(); //获得该类的Type

        var dics = options.GetDictionary();
        foreach (var item in dics)
        {
            var propertyInfo = entityType.GetProperty(item.Key);
            propertyInfo?.FieldSetValue(item.Key, item.Value);
        }

        if (AdoCommandTimeOut <= 0) AdoCommandTimeOut = 60;
    }

    public void PostConfigure(SqlSugarDbSettingOptions options, IConfiguration configuration)
    {
    }

    /// <summary>
    ///     获取sqlsugar连接对象集合
    /// </summary>
    /// <returns></returns>
    public List<ConnectionConfig> GetSqlSugarConnectionConfigs()
    {
        if (ConnectionConfigs == null) return new List<ConnectionConfig>();
        return ConnectionConfigs.Select(o => o as ConnectionConfig).ToList();
    }
}

/// <summary>
///     SqlSugar设置数据库连接配置
/// </summary>
public class SqlSugarDbSettingConnectionConfig : ConnectionConfig
{
    /// <summary>
    ///     数据库名称
    /// </summary>
    public string Database { get; set; }
}